package com.example.repository;

import com.example.entity.Document;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.annotations.Query;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 文档数据访问层
 * 继承ElasticsearchRepository提供基本的CRUD操作
 */
@Repository
public interface DocumentRepository extends ElasticsearchRepository<Document, String> {

    /**
     * 根据标题查找文档
     */
    List<Document> findByTitle(String title);

    /**
     * 根据作者查找文档
     */
    List<Document> findByAuthor(String author);

    /**
     * 根据标签查找文档
     */
    List<Document> findByTagsIn(List<String> tags);

    /**
     * 根据状态查找文档
     */
    Page<Document> findByStatus(Integer status, Pageable pageable);

    /**
     * 根据创建时间范围查找文档
     */
    List<Document> findByCreateTimeBetween(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 根据标题和内容进行模糊查询
     */
    @Query("{\"bool\": {\"should\": [{\"match\": {\"title\": \"?0\"}}, {\"match\": {\"content\": \"?0\"}}]}}")
    Page<Document> searchByTitleOrContent(String keyword, Pageable pageable);

    /**
     * 多字段搜索 - 使用multi_match查询
     */
    @Query("{\"multi_match\": {\"query\": \"?0\", \"fields\": [\"title^2\", \"content\", \"author\"]}}")
    Page<Document> multiFieldSearch(String keyword, Pageable pageable);

    /**
     * 高亮搜索
     */
    @Query("{\"bool\": {\"should\": [{\"match\": {\"title\": \"?0\"}}, {\"match\": {\"content\": \"?0\"}}]}}")
    Page<Document> searchWithHighlight(String keyword, Pageable pageable);

    /**
     * 根据阅读数范围查找
     */
    List<Document> findByReadCountBetween(Integer minCount, Integer maxCount);

    /**
     * 删除某个作者的所有文档
     */
    void deleteByAuthor(String author);
}